listview: Move ::factory out of the item manager
authorBenjamin Otte <otte@redhat.com>
Sun, 12 Mar 2023 21:03:03 +0000 (22:03 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 23 Mar 2023 03:45:03 +0000 (04:45 +0100)
It's a listitemwidget property, and the item manager manages the items,
not the widgets.

gtk/gtkcolumnview.c
gtk/gtkgridview.c
gtk/gtklistitemmanager.c
gtk/gtklistitemmanagerprivate.h
gtk/gtklistview.c
gtk/gtklistviewprivate.h

index c5eb91a364e7f6114695278eb711110099729195..ff325f0a5b60b5dcb79262c149aeb16b9c16cdfd 100644 (file)
@@ -142,7 +142,7 @@ gtk_column_list_view_create_list_widget (GtkListBase *base)
   GtkListView *self = GTK_LIST_VIEW (base);
   GtkWidget *result;
 
-  result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager),
+  result = gtk_list_item_widget_new (self->factory,
                                      "row",
                                      GTK_ACCESSIBLE_ROLE_ROW);
 
index eb261b8a81ac7e28f7a63356b576e151f379d148..991b76a5be296c68bd79446478f06ec3acce4b7e 100644 (file)
@@ -88,6 +88,7 @@ struct _GtkGridView
   GtkListBase parent_instance;
 
   GtkListItemManager *item_manager;
+  GtkListItemFactory *factory;
   guint min_columns;
   guint max_columns;
   gboolean single_click_activate;
@@ -263,7 +264,7 @@ gtk_grid_view_create_list_widget (GtkListBase *base)
   GtkGridView *self = GTK_GRID_VIEW (base);
   GtkWidget *result;
 
-  result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager),
+  result = gtk_list_item_widget_new (self->factory,
                                      "child",
                                      GTK_ACCESSIBLE_ROLE_GRID_CELL);
 
@@ -877,7 +878,7 @@ gtk_grid_view_get_property (GObject    *object,
   switch (property_id)
     {
     case PROP_FACTORY:
-      g_value_set_object (value, gtk_list_item_manager_get_factory (self->item_manager));
+      g_value_set_object (value, self->factory);
       break;
 
     case PROP_MAX_COLUMNS:
@@ -1202,7 +1203,7 @@ gtk_grid_view_get_factory (GtkGridView *self)
 {
   g_return_val_if_fail (GTK_IS_GRID_VIEW (self), NULL);
 
-  return gtk_list_item_manager_get_factory (self->item_manager);
+  return self->factory;
 }
 
 /**
@@ -1216,13 +1217,22 @@ void
 gtk_grid_view_set_factory (GtkGridView        *self,
                            GtkListItemFactory *factory)
 {
+  GtkListTile *tile;
+
   g_return_if_fail (GTK_IS_GRID_VIEW (self));
   g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory));
 
-  if (factory == gtk_list_item_manager_get_factory (self->item_manager))
+  if (!g_set_object (&self->factory, factory))
     return;
 
-  gtk_list_item_manager_set_factory (self->item_manager, factory);
+  for (tile = gtk_list_item_manager_get_first (self->item_manager);
+       tile != NULL;
+       tile = gtk_rb_tree_node_get_next (tile))
+    {
+      if (tile->widget)
+        gtk_list_item_widget_set_factory (GTK_LIST_ITEM_WIDGET (tile->widget), factory);
+    }
+
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FACTORY]);
 }
index cb0d0709609271b76e3294f031072e565b35e553..8ef33b5def00a13aea32b4f9ffa20a5dd8538027 100644 (file)
@@ -31,7 +31,6 @@ struct _GtkListItemManager
 
   GtkWidget *widget;
   GtkSelectionModel *model;
-  GtkListItemFactory *factory;
 
   GtkRbTree *items;
   GSList *trackers;
@@ -1063,8 +1062,6 @@ gtk_list_item_manager_dispose (GObject *object)
 
   gtk_list_item_manager_clear_model (self);
 
-  g_clear_object (&self->factory);
-
   g_clear_pointer (&self->items, gtk_rb_tree_unref);
 
   G_OBJECT_CLASS (gtk_list_item_manager_parent_class)->dispose (object);
@@ -1083,50 +1080,6 @@ gtk_list_item_manager_init (GtkListItemManager *self)
 {
 }
 
-void
-gtk_list_item_manager_set_factory (GtkListItemManager *self,
-                                   GtkListItemFactory *factory)
-{
-  guint n_items;
-  GSList *l;
-
-  g_return_if_fail (GTK_IS_LIST_ITEM_MANAGER (self));
-  g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory));
-
-  if (self->factory == factory)
-    return;
-
-  n_items = self->model ? g_list_model_get_n_items (G_LIST_MODEL (self->model)) : 0;
-  gtk_list_item_manager_remove_items (self, NULL, 0, n_items);
-
-  g_set_object (&self->factory, factory);
-
-  gtk_list_item_manager_add_items (self, 0, n_items);
-
-  gtk_list_item_manager_ensure_items (self, NULL, G_MAXUINT);
-
-  for (l = self->trackers; l; l = l->next)
-    {
-      GtkListItemTracker *tracker = l->data;
-      GtkListTile *tile;
-
-      if (tracker->widget == NULL)
-        continue;
-
-      tile = gtk_list_item_manager_get_nth (self, tracker->position, NULL);
-      g_assert (tile);
-      tracker->widget = GTK_LIST_ITEM_BASE (tile->widget);
-    }
-}
-
-GtkListItemFactory *
-gtk_list_item_manager_get_factory (GtkListItemManager *self)
-{
-  g_return_val_if_fail (GTK_IS_LIST_ITEM_MANAGER (self), NULL);
-
-  return self->factory;
-}
-
 void
 gtk_list_item_manager_set_model (GtkListItemManager *self,
                                  GtkSelectionModel  *model)
index 74772651c93a4df9ed249861f42e42c209f0ead9..9b5d33812c7d5a88470ef86fb3a8c15c64211018 100644 (file)
@@ -101,9 +101,6 @@ GtkListTile *           gtk_list_tile_split                     (GtkListItemMana
 GtkListTile *           gtk_list_tile_gc                        (GtkListItemManager     *self,
                                                                  GtkListTile            *tile);
 
-void                    gtk_list_item_manager_set_factory       (GtkListItemManager     *self,
-                                                                 GtkListItemFactory     *factory);
-GtkListItemFactory *    gtk_list_item_manager_get_factory       (GtkListItemManager     *self);
 void                    gtk_list_item_manager_set_model         (GtkListItemManager     *self,
                                                                  GtkSelectionModel      *model);
 GtkSelectionModel *     gtk_list_item_manager_get_model         (GtkListItemManager     *self);
index cb4e601269049aefe701928782fa4ea97e966cbc..eff45468f9778f921888e1d9e030194fb3256976 100644 (file)
@@ -222,7 +222,7 @@ gtk_list_view_create_list_widget (GtkListBase *base)
   GtkListView *self = GTK_LIST_VIEW (base);
   GtkWidget *result;
 
-  result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager),
+  result = gtk_list_item_widget_new (self->factory,
                                      "row",
                                      GTK_ACCESSIBLE_ROLE_LIST_ITEM);
 
@@ -628,7 +628,7 @@ gtk_list_view_get_property (GObject    *object,
   switch (property_id)
     {
     case PROP_FACTORY:
-      g_value_set_object (value, gtk_list_item_manager_get_factory (self->item_manager));
+      g_value_set_object (value, self->factory);
       break;
 
     case PROP_MODEL:
@@ -927,7 +927,7 @@ gtk_list_view_get_factory (GtkListView *self)
 {
   g_return_val_if_fail (GTK_IS_LIST_VIEW (self), NULL);
 
-  return gtk_list_item_manager_get_factory (self->item_manager);
+  return self->factory;
 }
 
 /**
@@ -941,13 +941,21 @@ void
 gtk_list_view_set_factory (GtkListView        *self,
                            GtkListItemFactory *factory)
 {
+  GtkListTile *tile;
+
   g_return_if_fail (GTK_IS_LIST_VIEW (self));
   g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory));
 
-  if (factory == gtk_list_item_manager_get_factory (self->item_manager))
+  if (!g_set_object (&self->factory, factory))
     return;
 
-  gtk_list_item_manager_set_factory (self->item_manager, factory);
+  for (tile = gtk_list_item_manager_get_first (self->item_manager);
+       tile != NULL;
+       tile = gtk_rb_tree_node_get_next (tile))
+    {
+      if (tile->widget)
+        gtk_list_item_widget_set_factory (GTK_LIST_ITEM_WIDGET (tile->widget), factory);
+    }
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FACTORY]);
 }
index 42aea60454ad12c45d1689efe2dbdf3d0ec880c1..791a0818f2d152fb6548626851b5e87128f83d10 100644 (file)
@@ -30,6 +30,7 @@ struct _GtkListView
   GtkListBase parent_instance;
 
   GtkListItemManager *item_manager;
+  GtkListItemFactory *factory;
   gboolean show_separators;
   gboolean single_click_activate;
 };